return {
    -- dap 客户端
    "mfussenegger/nvim-dap",
    dependencies = {
        -- debugger界面UI，link: https://github.com/rcarriga/nvim-dap-ui
        "rcarriga/nvim-dap-ui",
        -- 虚拟文本支持用于提示变量值
        "theHamsta/nvim-dap-virtual-text",
        -- 美化 configuration 选择界面
        "nvim-telescope/telescope-dap.nvim",

        -- 集成一些语言的DAP配置，可以不用写 adapter，只需要维护 configurations
        -- link: https://github.com/jay-babu/mason-nvim-dap.nvim
        -- { "jay-babu/mason-nvim-dap.nvim", version = '2.1.0' },
        "jay-babu/mason-nvim-dap.nvim",
        --
        -- 提供python语言的默认配置(adapter、configurations)
        -- link: https://github.com/mfussenegger/nvim-dap-python
        -- "mfussenegger/nvim-dap-python",
    },
    keys = {
        -- vim.keymap.set('n', '<F5>', function() require('dap').continue() end)
        { '<F5>',      function() require 'telescope'.extensions.dap.configurations {} end },
        { '<F10>',     function() require('dap').step_over() end },
        { '<F11>',     function() require('dap').step_into() end },
        { '<F12>',     function() require('dap').step_out() end },
        { '<Leader>b', function() require('dap').toggle_breakpoint() end },
        { '<Leader>B', function() require('dap').set_breakpoint() end },
        { '<Leader>lp',
            function() require('dap').set_breakpoint(nil, nil, vim.fn.input('Log point message: ')) end },
        { '<Leader>dr', function() require('dap').repl.open() end },
        { '<Leader>dl', function() require('dap').run_last() end },
        {
            '<Leader>dh',
            function()
                require('dap.ui.widgets').hover()
            end,
            mode = { 'n', 'v' }
        },
        {
            '<Leader>dp',
            function()
                require('dap.ui.widgets').preview()
            end,
            mode = { 'n', 'v' }
        },
        { '<Leader>df', function()
            local widgets = require('dap.ui.widgets')
            widgets.centered_float(widgets.frames)
        end },
        { '<Leader>ds', function()
            local widgets = require('dap.ui.widgets')
            widgets.centered_float(widgets.scopes)
        end },
    },
    config = function()
        local dap, dapui = require("dap"), require("dapui")
        require("nvim-dap-virtual-text").setup()
        require("dapui").setup()
        dap.listeners.after.event_initialized["dapui_config"] = function()
            dapui.open()
        end
        dap.listeners.before.event_terminated["dapui_config"] = function()
            dapui.close()
        end
        dap.listeners.before.event_exited["dapui_config"] = function()
            dapui.close()
        end

        -- require("dap-python").setup()
        require("mason-nvim-dap").setup({
            ensure_installed = { 'python', 'php', 'bash' },
            handlers = {
                function(config)
                    -- all sources with no handler get passed here

                    -- Keep original functionality
                    require('mason-nvim-dap').default_setup(config)
                end,
                php = function(config)
                    config.configurations = {
                        {
                            type = 'php',
                            request = 'launch',
                            name = 'PHP: Listen for Xdebug',
                            port = 9003,
                            -- pathMappings = {
                            --     ["/var/www/html"] = "${workspaceFolder}"
                            -- }
                        },
                    }
                    require('mason-nvim-dap').default_setup(config) -- don't forget this!
                end,
            }
        })
    end
}
